package com.aa;

import android.os.Handler;
import android.widget.Toast;

import com.aa.utils.FileInfo;
import com.aa.utils.FileRead;
import com.aa.utils.GsonUtils;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by RIOS on 2018/10/19.
 */

public class JSUtils extends ReactContextBaseJavaModule {
    private static final String DURATION_SHORT_KEY = "SHORT";
    private static final String DURATION_LONG_KEY = "LONG";

    public JSUtils(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "NativeUtils";//这个名字在 JavaScript 端标记这个模块
    }

    //一个可选的方法getContants返回了需要导出给 JavaScript 使用的常量。它并不一定需要实现，但在定义一些可以被 JavaScript 同步访问到的预定义的值时非常有用。
    @Override
    public Map<String, Object> getConstants() {
        final Map<String, Object> constants = new HashMap<>();
        constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
        constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
        return constants;
    }


    //    要导出一个方法给 JavaScript 使用，Java 方法需要使用注解@ReactMethod。方法的返回类型必须为void。
    // React Native 的跨语言访问是异步进行的，所以想要给 JavaScript 返回一个值的唯一办法是使用回调函数或者发送事件（参见下文的描述）。
    @ReactMethod
    public void callbackTest(String message, final Callback callback) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (callback != null) {
                    callback.invoke("回调callback");
                }
            }
        }, 3000);

    }

    @ReactMethod
    public void readNovelFile(final Callback callback) {
        FileRead.readNovelFlie(getReactApplicationContext(), new FileRead.CallBack() {
            @Override
            public void result(List<FileInfo> localPath) {
                callback.invoke(GsonUtils.toJson(localPath));
            }
        });

    }

    @ReactMethod
    public void readFileContent(final String path, final Callback callback) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                String content = FileRead.readTxtLine(path);
                callback.invoke(content);
            }
        }).start();
    }

    @ReactMethod
    public void showToast(String message, int duration) {
        Toast.makeText(getReactApplicationContext(), message, duration).show();
    }
}
